<?php
/*
 * 所有模块的公共方法写这里
 * response() # 接口返回处理
 * get_sys_config() # 获取系统配置信息
 * back() # 返回上一页
 * monday_to_time() # 返回当前每周一0:0:0的时间戳
 * export_csv() # 导出CSV文件(cxcel文件)
 * rand_code() # 生成随机字符串
 * dr_mkdirs() # 递归创建目录
 * save_base64() # 保存base64图片
 * post_curl() # curl post请求
 * send_sms() # 发送验证码
 * code_verify() # 验证验证码是否有效
 * send_aliyun_sms() # 阿里云短信发送服务
 * */
namespace Common\Controller;
use Think\Controller;
class CommonFunctionController extends Controller {

    /*
     * 接口返回必须调用这个方法
     * */
    protected function response($status = 200, $message = '所有模块的公共方法写这里', $data = array()){
        $response = array();
        $response['status'] = $status;
        $response['message'] = $message;
        $response['data'] = empty($data)? '' : $data;
        $this->ajaxReturn($response);
    }

    /*
     * 获取系统配置信息
     * return array 系统配置数组
     * */
    protected function get_sys_config(){
        $sys_configM = M('sys_config');
        $sys_config = $sys_configM->find();
        return  unserialize($sys_config['sys_config']);
    }

    /*
    * 返回上一页
    * */
    protected function back(){
        exit('<script>history.back()</script>');
    }

    /*
    * 返回缩略图
    * */
    protected function get_picture_thumb($file){
        if(empty($file)){
            return C('WWWROOT_URL').'/Public/image/thumb_no_picture.png';
        }
        $arr = pathinfo($file);
        $file = C('WWWROOT_URL').$arr['dirname'].'/thumb_'.$arr['basename'];
        return $file;
    }

    /*
    * 返回原图地址
    * */
    protected function get_picture($file){
        if(empty($file)){
            return C('WWWROOT_URL').'/Public/image/no_picture.png';
        }
        return C('WWWROOT_URL').$file;
    }


    /*
     * 返回当前每周一0:0:0的时间戳
     * */
    protected function monday_to_time($time = 0){
        if(!$time){
            $time = NOW_TIME;
        }
        $weekday = date('N', $time);
        $cha = $weekday-1;
        $day = strtotime('-'.$cha.' day');
        $day = date('Y-m-d', $day);
        $monday_time = strtotime($day);
        return $monday_time;
    }


    /**
     * 导出CSV文件
     * @param array $data        二维数组数据
     * @param array $header excel第一行标题 例如 $header = array('标题1', '标题2');
     * @param string $file_name  文件名称
     * @return string
     */
    public function export_csv($data = array(), $header = array(), $file_name = '')
    {
        header('Content-Type: application/vnd.ms-excel');
        header('Content-Disposition: attachment;filename='.$file_name);
        header('Cache-Control: max-age=0');
        $fp = fopen('php://output', 'a');
        if (!empty($header)) {
            foreach ($header as $key => $value) {
                $header[$key] = iconv('utf-8', 'gbk', $value);
            }
            fputcsv($fp, $header);
        }
        $num = 0;
        //每隔$limit行，刷新一下输出buffer，不要太大，也不要太小
        $limit = 100000;
        //逐行取出数据，不浪费内存
        $count = count($data);
        if ($count > 0) {
            for ($i = 0; $i < $count; $i++) {
                $num++;
                //刷新一下输出buffer，防止由于数据过多造成问题
                if ($limit == $num) {
                    ob_flush();
                    flush();
                    $num = 0;
                }
                $row = $data[$i];
                foreach ($row as $key => $value) {
                    $row[$key] = iconv('utf-8', 'gbk', '`'.$value);
                }
                fputcsv($fp, $row);
            }
        }
        fclose($fp);
    }


    /**
     * 生成随机字符串
     * @param int       $length  要生成的随机字符串长度
     * @param string    $type    随机码类型：0，数字+大小写字母；1，数字；2，小写字母；3，大写字母；4，特殊字符；-1，数字+大小写字母+特殊字符
     * @return string
     */
    protected function rand_code($length = 5, $type = 0) {
        $arr = array(1 => "0123456789", 2 => "abcdefghijklmnopqrstuvwxyz", 3 => "ABCDEFGHIJKLMNOPQRSTUVWXYZ", 4 => "~@#$%^&*(){}[]|");
        if ($type == 0) {
            array_pop($arr);
            $string = implode("", $arr);
        } elseif ($type == "-1") {
            $string = implode("", $arr);
        } else {
            $string = $arr[$type];
        }
        $count = strlen($string) - 1;
        $code = '';
        for ($i = 0; $i < $length; $i++) {
            $code .= $string[rand(0, $count)];
        }
        return $code;
    }

    /**
     * 递归创建目录
     * @param	string	$dir	目录名称
     * @return	bool|void
     */
   protected function dr_mkdirs($dir) {
        if (!$dir) {
            return FALSE;
        }
        //函数检查指定的文件是否是目录。
        if (!is_dir($dir)) {
            self::dr_mkdirs(dirname($dir));
            //目录是否存在
            if (!file_exists($dir)) {
                mkdir($dir, 0777);
            }
        }
   }


    /*
     * 保存base64位图片
     * @param string $base64pic base64图片信息
     * @param string $path 保存路径例如 IA_ROOT . "/attachment/pic/"
     * return string 正确返回 Y/m/d/filename.jpg 按年月日存放的地址,错误返回 error
     */
    protected function save_base64($base64pic, $path) {
        $level = date('Ymd/', time());//按年月日存放文件
        $path = $path . $level;
        self::dr_mkdirs($path);//创建目录
        $filename = self::rand_code(16);//公共函数
        //匹配出图片的格式
        if (preg_match('/^(data:\s*image\/(\w+);base64,)/', $base64pic, $result)) {
            $type = ($result[2] == 'jpeg') ? 'jpg' : $result[2];
            $path1 = $path . $filename . "." . $type;
            if (file_put_contents($path1, base64_decode(str_replace($result[1], '', $base64pic)))) {
                //保存等比的缩略图
                $image = new \Think\Image();
                $image->open($path1);
                $image->thumb(300, 300)->save($path  . 'thumb_'. $filename . "." . $type);
                return $level . $filename . "." . $type;
            }
        }
        return false;
    }


    /**
     * 以post方式提交数据到对应的接口url
     * @param string $data  需要post的array数据
     * @param string $url  url
     * @param int $second   url执行超时时间，默认30s
     */
    protected function post_curl($data = array(), $url = '', $second = 8)
    {
        //初始化curl
        $ch = curl_init();
        //设置超时
        curl_setopt($ch, CURLOPT_TIMEOUT, $second);

        curl_setopt($ch,CURLOPT_URL, $url);
        curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,FALSE);
        curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,FALSE);
        //设置header
        curl_setopt($ch, CURLOPT_HEADER, FALSE);
        //要求结果为字符串且输出到屏幕上
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);

        //post提交方式
        curl_setopt($ch, CURLOPT_POST, TRUE);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
        //运行curl
        $response = curl_exec($ch);
        //返回结果
        if($response){
            curl_close($ch);
            return $response;
        } else {
            $error = curl_errno($ch);
            curl_close($ch);
            return $error;
        }
    }

    /*
    * 发送验证码接口
    * */
    protected function send_sms($mobile = ""){
        $sysconfig = self::get_sys_config();
        if($sysconfig['aliyunsms'] != 1){
            self::response('200','短信未开启');
        }
        if(empty($mobile)){
            self::response('115','手机号为空');
        }
        if(!preg_match(C('REGULAR_MOBILE'), $mobile)){
            self::response('115','手机号格式不正确');
        }
        if(strlen($mobile) != 11){
            self::response('115','手机号长度不正确');
        }
        $code = self::rand_code(6,1);
        $smsM = M('sms_code');
        $save['mobile'] = $mobile;
        $save['code'] = $code;
        $save['created_time'] = NOW_TIME;
        $smsRes = $smsM->where("mobile = '{$mobile}'")->find();
        if(empty($smsRes)){
            $smsM->add($save);
        }else{
            //1分钟之内再次请求，验证码不变，不发短信
            if(NOW_TIME < ($smsRes['created_time'] + 60)){
                self::response('115','抱歉，操作频繁，请1分钟后再试');
            }
            $smsM->where("id = {$smsRes['id']}")->save($save);
        }
        //下面写调用第三方短信接口
        $res = self::send_aliyun_sms($mobile, 1, array('code'=>$code));
        if($res != 'success'){
            $error_logM = M('error_log');
            $save = array();
            $save['content'] = $res;
            $save['time'] = date('Y-m-d H:i:s');
            $error_logM->add($save);
        }
        return $res;
    }

    /*
    * 验证码是否有效
    * @params mobile 手机号码
    * @params code 验证码
    * */
    protected function code_verify($mobile = '', $code = ''){
       /* $whitelist = C('whitelist');
        if(in_array($mobile, $whitelist)){
            return true;
        }*/
        if($code == '1234'){
            return true;
        }
        $smsM = M('sms_code');
        $where = array();
        $where['mobile'] = $mobile;
        $where['created_time'] = array('gt', NOW_TIME - 600);//10分钟内有效
        $sms = $smsM->field('code')->where($where)->find();
        if(empty($sms) || $code != $sms['code']){
            return false;
        }else{
            return true;
        }
    }


    /*
     * 阿里云短信发送服务
     * phone # 手机号
     * type # 模板类型
     * data # 变量
     * */
    protected function send_aliyun_sms($phone = '', $type = 0, $data = array()){
        $allow_type = array(1,2,3);
        if(!in_array($type, $allow_type)){
            return '发短信的模板类型错误';
        }
        if(!preg_match('/1\d{10}/', $phone) || strlen($phone) != 11){
            return '发短信的手机号格式错误';
        }

        if($type == 1){
            $template = "SMS_103400045";
        }else{
            return '发短信的模板类型错误';
        }

        vendor('Aliyunsms/api_demo/Aliyunsms');
        $smsobj = new \Aliyunsms(
            "LTAIn58rjyjT15gi",
            "N7fpPoLBFUqDUQ8TWhSE48gOqlJks0"
        );

        $signName = "医加一共享会诊";
        $response = $smsobj->sendSms($signName, $template, $phone, $data);
        if($response->Code == 'OK'){
            return 'success';
        }else{
            return '短信发送出错了，错误信息'.json_encode($response);
        }
    }



}